﻿using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace Wpfконфигуратор.Визуализаторы
{
    // 
    public class ПеречислительВизуализатор : ВизуализаторОснова
    {
        public Enum Перечислитель { get { return ( Enum ) Объект; } set { Объект = value; } }
         public ПеречислительВизуализатор (){}

        public ПеречислительВизуализатор ( Enum перечислитель, Action<ВизуализаторОснова> обработчик )
        {
            Перечислитель = перечислитель;
            //ВернутьЗначение += обработчик;
        }

        public string Значение 
        {
            get { return  Перечислитель.ToString(); }
            set
            {
                Перечислитель = (Enum) Enum.Parse(Перечислитель.GetType(), value, true);
                ОбновитьСвойство("Значение");
            }
        }

        public string[] СписокПеречислителя
        {
            get
            {
                return Enum.GetNames(Перечислитель.GetType());
            }
        }
        
    }

    public class ЭлементФлага : ВизуализаторОснова
    {
        public ЭлементФлага( bool выбран, string имя, Int64 число)
        {
            _выбран = выбран;
            ИмяФлага = имя;
            Число = число;
        }
        private bool   _выбран;
        public bool Выбран
        {
            get { return _выбран; }
            set {
                _выбран = value; 
                 ОбновитьСвойство( "Выбран" );
            }
        }

        public string ИмяФлага { get; set; }
        public Int64 Число { get; set; }
    }
    /// <summary>
    /// Визуализатор флагового перечислителя ( Enum  с FlagsAttribute )
    /// </summary>
    public class ФлагВизуализатор : ВизуализаторОснова
    {
        public Enum Перечислитель { get { return ( Enum ) Объект; } set { Объект = value; } }

        public ФлагВизуализатор () { }
        public ФлагВизуализатор ( Enum перечислитель, Action<ВизуализаторОснова> обработчик )
        {
            Перечислитель = перечислитель;
            //if (обработчик != null) ВернутьЗначение += обработчик;
        }

        public string ЗначениеТекст
        {
            get
            {
                return  Convert.ToUInt64(Перечислитель)==0 ? "(пустой)" : Перечислитель.ToString();
            }
            set
            {
                    Перечислитель = ( Enum ) Enum.Parse( Перечислитель.GetType(), value, true );
                    ОбновитьСвойство( "ЗначениеТекст" );
            }
        }

        private List<ЭлементФлага> _списокФлагов;
        public List<ЭлементФлага>  СписокФлагов
        {
            get
            {
                if ( _списокФлагов != null ) return _списокФлагов;
                var флаги =Enum.GetValues(Перечислитель.GetType());
                _списокФлагов = new List<ЭлементФлага>();
                foreach (var флаг in флаги)
                {
                    // проблема Именоваными могут быть и сумма двух флагов  и нулевое значение
                    // Read =1 Write=2 ReadWrite=3 None=0
                   // поэтому при редактированиие если поменять ReadWrite, должны меняться сразу 3 строки
                    // выкидываем нечетные числа
                    var число = Convert.ToInt64(флаг);
                    if (число==0)continue;
                     if(число==1 || ( число - (число/2)*2 == 0)  )    // если число=1 или кратно 2 , то добавить
                     {
                         var новый = new ЭлементФлага( 
                             Перечислитель.HasFlag((Enum) флаг),
                             флаг.ToString(), 
                             число);
                        новый.PropertyChanged += ОбновитьФлаг;
                        _списокФлагов.Add( новый);
                    }
                }
                return _списокФлагов;
            }
        }    
        
        public void ОбновитьФлаг (     Object sender,   PropertyChangedEventArgs e  )
        {
            Int64 число = 0;
            foreach ( var элементФлага in _списокФлагов )
            {
                число += элементФлага.Выбран ? элементФлага.Число : 0;
            }

            Перечислитель = ( Enum ) Enum.ToObject( Перечислитель.GetType(), число );
            ОбновитьСвойство( "ЗначениеТекст" );
        }
    }
}

